#pragma version(1)
#pragma rs_fp_relaxed
#pragma rs java_package_name(com.hanter.android.radwidget.cupertino)

#include "rs_graphics.rsh"

static float4 srcColor;

void setOverlayColor(int color) {
    srcColor = rsUnpackColor8888(color);
}

static float overlayC(float dst, float src, float dstA, float srcA) {
    if (2 * dst < dstA) {
        return 2 * src * dst;
    } else {
        return srcA * dstA - 2.0 * (dstA - src) * (srcA - dst);
    }
}

static float overlayA(float dst, float src) {
    return src + dst - src * dst;
}

uchar4 RS_KERNEL blendOverlay(uchar4 in, uint32_t x, uint32_t y) {
    float4 dst = rsUnpackColor8888(in);
    uchar4 outc = rsPackColorTo8888(overlayC(dst.r, srcColor.r, dst.a, srcColor.a),
        overlayC(dst.g, srcColor.g, dst.a, srcColor.a),
        overlayC(dst.b, srcColor.b, dst.a, srcColor.a),
        overlayA(dst.a, srcColor.a)
    );
    return outc;
}

static float blendScreenf(float dst, float src) {
    return dst + src - dst * src;
}

uchar4 RS_KERNEL blendScreen(uchar4 in, uint32_t x, uint32_t y) {
    float4 dst = rsUnpackColor8888(in);
    uchar4 outc = rsPackColorTo8888(blendScreenf(dst.r, srcColor.r),
        blendScreenf(dst.g, srcColor.g),
        blendScreenf(dst.b, srcColor.g),
        blendScreenf(dst.a, srcColor.a));
    return outc;
}

uchar4 RS_KERNEL blendLighten(uchar4 in, uint32_t x, uint32_t y) {
    float4 dst = rsUnpackColor8888(in);

    float a = srcColor.a + dst.a - srcColor.a * dst.a;

    float r;
    if (dst.r > srcColor.r) {
        r = (1 - dst.a) * srcColor.r + (1 - srcColor.a) * dst.r + dst.r;
    } else {
        r = (1 - dst.a) * srcColor.r + (1 - srcColor.a) * dst.r + srcColor.r;
    }

    float g;
    if (dst.g > srcColor.g) {
        g = (1 - dst.a) * srcColor.g + (1 - srcColor.a) * dst.g + dst.g;
    } else {
        g = (1 - dst.a) * srcColor.g + (1 - srcColor.a) * dst.g + srcColor.g;
    }

    float b;
    if (dst.b > srcColor.b) {
        b = (1 - dst.a) * srcColor.b + (1 - srcColor.a) * dst.b + dst.b;
    } else {
        b = (1 - dst.a) * srcColor.b + (1 - srcColor.a) * dst.b + srcColor.b;
    }

    uchar4 outc = rsPackColorTo8888(r, g, b, a);
    return outc;
}

uchar4 RS_KERNEL blendDarken(uchar4 in, uint32_t x, uint32_t y) {
   float4 dst = rsUnpackColor8888(in);

    float a = srcColor.a + dst.a - srcColor.a * dst.a;

    float r;
    if (dst.r > srcColor.r) {
        r = (1 - dst.a) * srcColor.r + (1 - srcColor.a) * dst.r + srcColor.r;
    } else {
        r = (1 - dst.a) * srcColor.r + (1 - srcColor.a) * dst.r + dst.r;
    }

    float g;
    if (dst.g > srcColor.g) {
        g = (1 - dst.a) * srcColor.g + (1 - srcColor.a) * dst.g + srcColor.g;
    } else {
        g = (1 - dst.a) * srcColor.g + (1 - srcColor.a) * dst.g + dst.g;
    }

    float b;
    if (dst.b > srcColor.b) {
        b = (1 - dst.a) * srcColor.b + (1 - srcColor.a) * dst.b + srcColor.b;
    } else {
        b = (1 - dst.a) * srcColor.b + (1 - srcColor.a) * dst.b + dst.b;
    }

    uchar4 outc = rsPackColorTo8888(r, g, b, a);
    return outc;
}

static float multipyF(float dst, float src) {
    return src * dst;
}

uchar4 RS_KERNEL blendMultiply(uchar4 in, uint32_t x, uint32_t y) {
    float4 dst = rsUnpackColor8888(in);
    uchar4 outc = rsPackColorTo8888(multipyF(dst.r, srcColor.r),
        multipyF(dst.g, srcColor.g),
        multipyF(dst.b, srcColor.b),
        multipyF(dst.a, srcColor.a));
    return outc;
}